<?php
error_reporting(E_ERROR);
include_once("dao_netapi.php");
include_once("../../config/dao.cfg.php");

function get_unigue_path()
{
	//在应用目录下建立一个data/sn文件夹，存放此用户的所有.sn文件
	$base_dir = dao_app_cfg_get('path');
	if(strlen($base_dir)==0)
	   $base_dir = "";
	$gsn_path = $base_dir."/data/daosn";
	if(!file_exists($gsn_path))
	{
		mkdir($gsn_path,0777,true);
	}
	return $gsn_path;
}

/*
通过全局信号量同步。
从文件里读取sn
加一，并写入文件
如文件不存在则创建并初始为0
*/
function get_file_unigue_next($name,$step=1,$max=1000)
{
	$snfile =get_unigue_path()."/". "g_$name.sn";
	$fp = fopen($snfile, 'r+');
	if($fp===false)
	{
		$fp = fopen($snfile, 'w+');
	}
	if($fp===false)
	{
		return 0;
	}
	if (flock($fp, LOCK_EX)) { // 进行排它型锁定
		$buffer = fread($fp,10);
		$buffer=trim($buffer);		
		if(!is_numeric($buffer))
		{
			$buffer='0';
		}
		$counter=intval($buffer)+$step;
		if($max>0&&$counter>$max)
		{
			$counter=0;
		}
		$counter = ''.$counter;
		fseek($fp,0,SEEK_SET);
		fwrite($fp,'          ');
		fseek($fp,0,SEEK_SET);
		fwrite($fp,$counter);
		fflush($fp);
	    flock($fp, LOCK_UN); // 释放锁定
	} 
	else
	{
		return 0;
	}
	fclose($fp);
	return $counter;
}

function get_unique_next($name,$step=1,$max=1000)
{
	return get_file_unigue_next($name,$step,$max);
}

/*
传入名字，获取下一个sn。
会在当前目录创建同名文件
*/
function get_sn($name=NULL,$typeno=4,$max=1000000)
{
	if(strlen($name)==0)
	{
		$name = 'global_sn';
	}
	//$typeno = 4; /*1--call sn, 2--contact sn, 3--customer sn, 4--task id.*/;
	//格式:
	//时间12位(精确到S),ip地址后3位，类型(1位),序列号(0~999999));
	$dateStr = date('Ymd');
    $ip = get_local_ip();
	$ips =  explode ('.',$ip);	
	$machina_no = trim($ips[3]);
	$sn = get_unique_next($name,1,$max);
	$str_id = sprintf("%s%03s%01d%06d",$dateStr,$machina_no,$typeno%10,$sn);
	return $str_id;
}
if($argv)
{
	if($argv[1]=='ut_get_sn')
	{
		
		$sn = get_sn('test',1);
		echo $sn."\r\n";
	}
	
}
?>